home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 26
/
AMIGAplus Sonderheft 26 (2000)(Falke)(DE)(Track 1 of 2)[!].iso
/
Updates
/
HD-Installer
/
-WHDLoad-
/
WHDLoad_dev
/
Patcher1.04
/
PARAMQTX
/
imagergemx.asm
next >
Wrap
Assembly Source File
|
1999-03-29
|
7KB
|
365 lines
;another example of a formatconversion, this time for a hd-install
;the gemx-disk has some gaps, and due highscorefile there will be
;5 parts created
INCDIR ASM-ONE:INCLUDE2.0/
INCLUDE OWN/Patcher.I
INCLUDE DEVICES/TRACKDISK.I
INCLUDE EXEC/EXEC_LIB.I
INCLUDE EXEC/IO.I
INCLUDE LIBRARIES/DOS_LIB.I
HP MOVEQ.L #20,D0
RTS
DC.L TAB
DC.B 'PTCH'
DC.B '$VER:Gemx_Diskimager_V1.01',0
EVEN
TAB DC.L PCH_INIT,INITROUT
DC.L PCH_FILECOUNT,5
DC.L PCH_ADAPTOR,ADNAME
DC.L PCH_DISKNAME,DISKNAMEARRAY
DC.L PCH_FILENAME,FILENAMEARRAY
DC.L PCH_CHANGES,CHANGESARRAY
DC.L PCH_NAME,PARAMNAME
DC.L PCH_DATALENGTH,LENGTHTABLE
DC.L PCH_SPECIAL,SPECIALARRAY
DC.L PCH_STATE,STATEARRAY
DC.L PCH_STATE2,STATEARRAY2
DC.L PCH_MINVERSION,VERSNAME ;minimum version of THE PATCHER
DC.L 0
;minimum version of the patcher required, its a commandline-parameter
VERSNAME DC.B 'V1.01' ;MAY NOT CONTAIN HEADING ZEROES
EVEN ;MUST CONTAIN 2 NUMBERS AFTER POINT
ADNAME DC.B 'Done by Harry.',0
EVEN
PARAMNAME DC.B 'Gemx, Diskimager for HD-install',0
EVEN
DISKNAMEARRAY DC.L DISK1NAME
DC.L DISK1NAME
DC.L DISK1NAME
DC.L DISK1NAME
DC.L DISK1NAME
DISK1NAME DC.B 'Gemx',0
EVEN
FILENAMEARRAY DC.L FILE1NAME
DC.L FILE2NAME
DC.L FILE3NAME
DC.L FILE4NAME
DC.L FILE5NAME
FILE1NAME DC.B 'disk.1',0
EVEN
FILE2NAME DC.B 'disk.2',0
EVEN
FILE3NAME DC.B 'disk.3',0
EVEN
FILE4NAME DC.B 'disk.4',0
EVEN
FILE5NAME DC.B 'disk.5',0
EVEN
;FILE1NAME DC.B 'Gemx002',0
; EVEN
;FILE2NAME DC.B 'Gemx074',0
; EVEN
;FILE3NAME DC.B 'Gemx083',0
; EVEN
;FILE4NAME DC.B 'Gemx084',0
; EVEN
;FILE5NAME DC.B 'Gemx130',0
; EVEN
LENGTHTABLE DC.L $3b*$1800
DC.L (83-74)*$1800
DC.L $1800 ;HIGHSCORE!
DC.L 43*$1800
DC.L $1E*$1800
CHANGESARRAY DC.L 0 ;no changes to made in cycle 1
DC.L 0
DC.L 0 ;no changes to made in cycle 3
DC.L 0
DC.L 0
;the parameter-initializing opens sourcedevice
INITROUT MOVEQ.L #0,D0
MOVE.L PTB_OPENDEVICE(A5),A0
JSR (A0)
TST.L D0
RTS
;loading-statetexts for the cycles
STATEARRAY DC.L LOADSTATE2
DC.L LOADSTATE2
DC.L LOADSTATE2
DC.L LOADSTATE2
DC.L LOADSTATE2
LOADSTATE2
DC.B 'Please insert your original writepro-',$A
DC.B 'tected disk in the source drive.',0
EVEN
STATEARRAY2 DC.L SAVESTATE ;no text in cycle 1
DC.L SAVESTATE
DC.L SAVESTATE
DC.L SAVESTATE
DC.L SAVESTATE
SAVESTATE
DC.B 'Please insert your destination disk.',0
EVEN
;routines to 'load' something
SPECIALARRAY DC.L LOADROUT
DC.L LOADROUT ;load stuff from original
DC.L LOADROUT
DC.L LOADROUT
DC.L LOADROUT
STARTTRACK
DC.B 2,$25*2,83,84,$41*2
EVEN
LOADROUT
;.xxx bra.s .xxx
MOVEQ.L #0,D7 ;one diskchange allowed
.NEU
.4 MOVE.L PTB_DEVICESOURCEPTR(A5),A1 ;disk in sourcedrive?
MOVE.W #TD_CHANGESTATE,IO_COMMAND(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L IO_ACTUAL(A1)
BNE.W .NOTORG
MOVE.L PTB_ADDRESSOFFILE(A5),A4 ;load first part of disk
LEA.L (A4),A2 ;offset to load in the dataspace
MOVEQ.L #0,D2
MOVE.B STARTTRACK(PC,D6.W),D2 ;starttrack on the disk
LEA.L LENGTHTABLE(PC),A3
MOVE.L D6,D3
LSL.L #2,D3
MOVE.L (A3,D3.L),D3 ;bytes to read
MOVEQ.L #0,D4 ;data from the start of the track
; bra.s .5 ;because reading starts with
;trackstart, this is obsolete
.3 TST.L D4
BNE.S .1
.5 MOVEQ.L #$4,D5 ;4 tries, then error
.55 MOVE.L PTB_DEVICESOURCEPTR(A5),A1
MOVE.L PTB_SPACE(A5),IO_DATA(A1) ;track is to load in PTB_SPACE
MOVE.L #$7C00,IO_LENGTH(A1) ;double length of track
;to decode the index-sync-read data
MOVE.L D2,D0 ;my own trackcounter
EOR.B #1,D0 ;disksides are reverse
MOVE.L D0,IO_OFFSET(A1)
MOVE.W #TD_RAWREAD,IO_COMMAND(A1)
MOVE.B #IOTDB_INDEXSYNC,IO_FLAGS(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L D0
BNE.W .ERR
MOVE.L PTB_SPACE(A5),A0
LEA.L $7C00(A0),A1 ;end of buffer
LEA.L $7C00(A0),A3
BSR.W TRACKDECODE
TST.L D0
BEQ.S .R1OK
DBF D5,.55
BRA.W .NOTORG
.R1OK
ADDQ.L #1,D2
ST D7 ;correct disk - nothing anymore
;to change
.1 MOVE.B (A3)+,(A2)+
ADDQ.L #1,D4
CMP.L #$1800,D4 ;tracklength
BNE.S .2
MOVEQ.L #0,D4 ;new track
.2 SUBQ.L #1,D3
BNE.W .3
MOVEQ.L #0,D4
.END MOVE.L PTB_DEVICESOURCEPTR(A5),A1 ;switch motor off
MOVE.L #0,IO_LENGTH(A1)
MOVE.W #TD_MOTOR,IO_COMMAND(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
MOVE.L D4,D0
RTS
.ERR MOVEQ.L #-1,D4
BRA.S .END
.NOTORG TST.L D7 ;if the first time the original
BNE.S .ERR ;was not in the source drive,
ST D7 ;youll be asked to put it there
LEA.L LINE1(PC),A0
LEA.L LINE2(PC),A1
MOVE.L PTB_REQUEST(A5),A6
JSR (A6)
TST.L D0
BNE.S .ERR
BRA.W .NEU
LINE1 DC.B 'Please insert your original',0
EVEN
LINE2 DC.B 'in the source drive.',0
EVEN
;< A0 RAWTRACK
;< A1 TRACKBUFFER
;> D0 ERROR
GETSYNC
;SYNCANFANG SUCHEN
.SHF2 MOVEQ.L #$10-1,D5
.SHF1 MOVE.L (A2),D0
LSR.L D5,D0
CMP.W #$4489,D0
BEQ.S .SY
DBF D5,.SHF1
ADDQ.L #2,A2
CMP.L A2,A4
BHI.S .SHF2
BRA.S .ERR
.SY
MOVE.L (A2),D0
ADDQ.L #2,A2
LSR.L D5,D0
CMP.W #$4489,D0
BNE.S .SY
.1 MOVE.L (A2),D0
ADDQ.L #2,A2
LSR.L D5,D0
CMP.W #$4489,D0
BEQ.S .1
SUBQ.L #2,A2
CMP.L A2,A4
BLS.S .ERR
MOVEQ.L #0,D0
RTS
.ERR MOVEQ.L #-1,D0
RTS
;< A0 RAWTRACK
;< A1 TRACKBUFFER
;> D0 ERROR
;INTERN
; D5 SHIFT-COUNT
; D4 #$55555555
TRACKDECODE MOVEM.L A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
MOVE.L A0,A2
LEA.L ($7C00-2*$1808)(A0),A4 ;LAST CHANCE FOR CORRECT SYNC
MOVE.L #$55555555,D4
.TRY BSR.W GETSYNC
TST.L D0
BNE.W .ERR
MOVE.L (A2),D0
; ADDQ.L #2,A2
LSR.L D5,D0
CMPI.W #$2AAA,D0
BNE.W .TRY
MOVE.W #$05FF,D7
MOVEQ #$00,D3
.1
; MOVE.L (A2)+,D0 ;original code
;my code to get a longword
;that it works, a2 has to point 2 bytes
;before the real location! (see commented
;addq #2,a2 before)
MOVE.L (A2)+,D0 ;get higher part
MOVE.L (A2),D6 ;get lower part
LSR.L D5,D6 ;shift lower part with count
MOVEQ.L #$20,D2 ;higher part has to be shifted to fill
;the rest-place, a longword has 20 bits
SUB.L D5,D2
LSL.L D2,D0
OR.L D6,D0 ;my code ends
AND.L D4,D0
ASL.L #1,D0
; MOVE.L (A2)+,D1
;my code to get a longword
MOVE.L (A2)+,D1 ;get higher part
MOVE.L (A2),D6 ;get lower part
LSR.L D5,D6 ;shift lower part with count
MOVEQ.L #$20,D2 ;higher part has to be shifted to fill
;the rest-place, a longword has 20 bits
SUB.L D5,D2
LSL.L D2,D1
OR.L D6,D1 ;my code ends
AND.L D4,D1
OR.L D1,D0
ADD.L D0,D3
MOVE.L D0,(A1)+
DBF D7,.1
; MOVE.L (A2)+,D0
;my code to get a longword
MOVE.L (A2)+,D0 ;get higher part
MOVE.L (A2),D6 ;get lower part
LSR.L D5,D6 ;shift lower part with count
MOVEQ.L #$20,D2 ;higher part has to be shifted to fill
;the rest-place, a longword has 20 bits
SUB.L D5,D2
LSL.L D2,D0
OR.L D6,D0 ;my code ends
AND.L D4,D0
ASL.L #1,D0
; MOVE.L (A2)+,D1
;my code to get a longword
MOVE.L (A2)+,D1 ;get higher part
MOVE.L (A2),D6 ;get lower part
LSR.L D5,D6 ;shift lower part with count
MOVEQ.L #$20,D2 ;higher part has to be shifted to fill
;the rest-place, a longword has 20 bits
SUB.L D5,D2
LSL.L D2,D1
OR.L D6,D1 ;my code ends
ANDI.L D4,D1
OR.L D1,D0
CMP.L D0,D3
BNE.W .ERR
MOVEQ.L #0,D0
.END
MOVEM.L (A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
RTS
.ERR
MOVEQ.L #-1,D0
BRA.S .END